package com.ch.d0303;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;

@WebServlet(name = "UploadServlet", value = "/UploadServlet")
// 如果不加该注释，无法处理文件上传请求，报错
// Unable to process parts as no multi-part configuration has been provided
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        // 从请求中获取文件上传对象 Part , "file" 上传的文件提交的字段名称， 不是文件名
        Part file = request.getPart("myfile");
        file.getContentType(); // 文件类型 image , html , text
        file.getName();  // ==> 字段名 file
        file.getSize(); //文件大小
        file.getSubmittedFileName(); //上传的文件名， Servlet3.1 才有这个方法
//        file.write("f:/" + file.getSubmittedFileName()); // 保存文件
        //如何将文件上传到 webapp 下
        // 获取应用上下文对象 , 上下文 =》 运行环境
        // jsp 中应用上下文对象 叫application
        ServletContext application = request.getServletContext();
        // 将 /UploadServlet（web路径） 转换为 磁盘路径
        String realPath = application.getRealPath("/UploadServlet");
        System.out.println("realPath = " + realPath);
        // realPath 的目录不存在 ，那么创建文件夹
        new File(realPath).mkdirs();

        file.write(realPath + "/" + file.getSubmittedFileName()); //保存文件

        // src 的地址怎么写 ，假设文件名 a.jpg =》 /UploadServlet/a.jpg
        String webpath = "Uploads/" + file.getSubmittedFileName();
        response.getWriter().append("文件上传成功!<br>");

        if(file.getContentType().contains("image")){
            response.getWriter().printf("<img src='%s' style='height:200px'>",webpath);
        }else{
            //普通文件直接提供下载 ，download => 默认下载保存的文件名 => 强制下载
            response.getWriter().printf("<a href='%s' download='%s'>%s</a>"
                , webpath
                , file.getSubmittedFileName()
                , file.getSubmittedFileName());
        }
            // idea 里面的UploadServlet 是开发目录下的 UploadServlet
            // 浏览器上传到 UploadServlet 是运行目录下的 UploadServlet

            // 重启服务之后， 运行目录里面多出的文件， 可能会被清除
    }
}
